#!/usr/bin/env python3
"""
batch_decode_keep.py
批量解析当前目录下所有 tb_*.csv，
保留 DataSet 列，并将其中 4 字节一组的 IEEE-754 浮点解码成小数追加到右侧。
若某行 DataSet 长度非 4 的倍数则跳过该行。
"""

import os
import glob
import struct
import ast
import pandas as pd


def decode_safe(blob: bytes):
    """
    把 4*n 字节数据解码成 n 个 float；
    若长度不是 4 的倍数，返回空列表（表示跳过该行）。
    """
    if len(blob) % 4:
        return []
    return list(struct.unpack(f'<{len(blob)//4}f', blob))


def process_one(csv_path: str):
    """处理单个文件"""
    df = pd.read_csv(csv_path)
    if "DataSet" not in df.columns:
        print(f"⚠️ 跳过 {csv_path}：缺少 DataSet 列")
        return

    # 字符串 b'...' 转 bytes
    df["DataSet"] = df["DataSet"].apply(lambda s: ast.literal_eval(s))

    # 逐行解码，跳过不合法行
    decoded_rows = []
    skip_count = 0
    for blob in df["DataSet"]:
        floats = decode_safe(blob)
        if not floats:
            skip_count += 1
        decoded_rows.append(floats)

    if skip_count == len(df):
        print(f"⚠️ 跳过 {csv_path}：所有行 DataSet 长度均非 4 字节倍数")
        return

    # 构造浮点 DataFrame
    float_df = pd.DataFrame(decoded_rows)
    float_df.columns = [f"f{i}" for i in float_df.columns]

    # 保留三位小数
    float_df = float_df.round(3)

    # 横向拼接（保留原 DataSet）
    out = pd.concat([df, float_df], axis=1)

    # 保存
    out_name = "decode_" + os.path.basename(csv_path)
    out.to_csv(out_name, index=False, encoding="utf-8")
    print(
        f"✅ {csv_path} → {out_name}  "
        f"({len(df)} 行, 跳过 {skip_count} 行, 输出 {out.shape[1]} 列)"
    )


def main():
    csv_list = sorted(glob.glob("tb_*.csv"))
    if not csv_list:
        print("⚠️ 当前目录未找到 tb_*.csv")
        return
    for csv_file in csv_list:
        process_one(csv_file)


if __name__ == "__main__":
    main()